package org.example.test_zhanbao_chaibao;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

//拆包处理器 在解码器之前
public class StarDelimiterFrameDecoder extends ByteToMessageDecoder {

    private static final byte DELIMITER = (byte) '*';

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 获取当前缓冲区可读字节数
        int readableBytes = in.readableBytes();
        // 用于记录分隔符的位置，初始化为-1表示未找到
        int frameEndIndex = -1;

        // 遍历缓冲区中可读字节，查找分隔符'*'的位置
        for (int i = in.readerIndex(); i < in.readerIndex() + readableBytes; i++) {
            // 判断当前位置的字节是否是分隔符
            if (in.getByte(i) == DELIMITER) {
                frameEndIndex = i; // 记录分隔符索引
                break;             // 找到第一个分隔符后退出循环
            }
        }

        if (frameEndIndex >= 0) {
            // 找到分隔符，计算消息内容长度（不包含分隔符）
            int frameLength = frameEndIndex - in.readerIndex();
            // 从缓冲区中读取该长度的消息片段，且保留引用计数
            ByteBuf frame = in.readRetainedSlice(frameLength);
            // 跳过分隔符本身的一个字节
            in.skipBytes(1);

            // 将切割出来的消息帧加入到解码结果列表中，交给后续handler处理
            out.add(frame);
        } else {
            // 未找到分隔符，说明消息可能未完整，需要等待后续数据到来
            // 此时不处理任何数据，decode方法返回，等待下次调用
        }
    }
}
